import 'dart:async';
import 'dart:io';

import 'package:flutter/services.dart';



final _isMobile = Platform.isIOS || Platform.isAndroid;
final _isNotMobile = !_isMobile;

/// 与原生交互
class Natives {
  /// flutter channel
  static const MethodChannel _channel =
      MethodChannel('com.ltl.keep_book');

  Natives._();

  /// 单例。
  static final shared = Natives._();

  bool isHomeInitialized = false;

  /// 接收到 method call 时，[Home] 还没初始化，导致跳转不了。
  /// 记录一次事件使 [Home] 能初始至默认页面。
  // ---------- Flutter 调用原生(安卓/iOS)方法 ----------

  /// 获取手机标识
  static FutureOr<String> getOaid() {
    if (_isNotMobile) {
      return '';
    }
    return _channel
        .invokeMethod<String>('getOaid')
        .then((value) => value ?? '');
  }

  /// 原生调用微信 OpenSDK 进行分享。
  ///
  /// [info] 为分享数据。包含的字段如下：
  /// [title] 标题；
  /// [text] 内容；
  /// [icon] 图片链接；
  /// [webpageUrl] 网页链接；
  /// [platform] = 1 为分享到对话；
  /// [platform] = 2 为分享到朋友圈；
  /// [platform] = 3 为分享到收藏；
  ///
  /// 微信分享不告诉第三方 App 分享结果，因此不需要返回数据了。
  static void weixinShare(Map<String, dynamic> info) {
    if (_isMobile) {
      _channel.invokeMethod('weixinShare', info);
    }
  }

  /// 调用微信小程序。
  ///
  /// [payment] 传递给小程序的信息
  static void weixinMini(Map<String, dynamic> payment) {
    if (_isMobile) {
      _channel.invokeMapMethod('weixinMini', payment);
    }
  }

  /// 使用手机默认浏览器打开 [url]
  static void openUrlInBrowser(String url) {
    if (_isMobile) {
      _channel.invokeMethod('openUrlInBrowser', url);
    }
  }

  /// 调用闪验 SDK 预获取手机号。
  ///
  /// 返回的数据 iOS 为 NSDictionary 类型，安卓为 Map 类型。
  /// 如果获取失败，则返回 null。
  static FutureOr<Map?> shanYanPreGetPhoneNumber() {
    if (_isNotMobile) {
      return null;
    }
    return _channel.invokeMapMethod('shanYanPreGetPhoneNumber');
  }

  /// 闪验登录，获取 token。
  ///
  /// 如果登录成功，则返回 token；
  /// 登录失败，则返回 null。
  static FutureOr<String?> shanYanLogin() {
    if (_isNotMobile) {
      return null;
    }
    return _channel.invokeMethod<String>('shanYanLogin');
  }

  /// 跳转微信客服 [url] （用于 Android）
  static FutureOr<bool?> weChatClient(String url) {
    if (Platform.isAndroid) {
      return _channel.invokeMethod<bool>('openWeChatClient', url);
    } else {
      return null;
    }
  }

  /// 判断是否有安装孕育 App。(用于 iOS)
  /// 返回：1 - 安装；0 - 未安装；
  static FutureOr<int?> isInstalledPregnancyApp() {
    if (Platform.isIOS) {
      return _channel.invokeMethod<int>('isInstalledPregnancyApp');
    } else {
      return null;
    }
  }

  /// 获取app渠道号 (用于 Android)
  static FutureOr<String?> getChannel() {
    if (Platform.isAndroid) {
      return _channel.invokeMethod<String>('getChannel');
    } else {
      return null;
    }
  }

  /// Android Push初始化
  static void initPush() {
    if (Platform.isAndroid) {
      _channel.invokeMethod<String>('initPush');
    }
  }

  /// 系统推送通知是否打开。
  /// 返回：1 - 已打开；0 - 关闭；
  static FutureOr<bool?> isNotificationTurnOn() {
    if (Platform.isIOS || Platform.isAndroid) {
      return _channel
          .invokeMethod<int>('isNotificationTurnOn')
          .then((value) => value != null && value != 0);
    }
    return false;
  }

  /// 是否询问过通知权限。（用于 iOS）
  static FutureOr<bool?> isNotificationNotDetermined() {
    if (Platform.isIOS) {
      return _channel
          .invokeMethod<int>('isNotificationNotDetermined')
          .then((value) => value != null && value != 0);
    } else {
      return null;
    }
  }

  /// 打开/关闭通知。
  /// (用于 Android，iOS只能跳到系统设置管理)
  ///
  /// 返回 true = 成功；false = 失败。
  static FutureOr<bool?> turnOnNotification(bool isOn) {
    if (Platform.isAndroid) {
      return _channel
          .invokeMethod<int>('turnOnNotification', isOn ? 1 : 0)
          .then((value) => value != null && value != 0);
    } else {
      return false;
    }
  }

  /// 跳转系统通知设置页。
  static void gotoSystemNotificationSettings() {
    if (_isMobile) {
      _channel.invokeMethod('gotoSystemNotificationSettings');
    }
  }

  /// 注册通知（远程推送 APNs，用于 iOS）
  static FutureOr<bool?> registerRemoteNotification() async {
    if (Platform.isIOS) {
      return _channel.invokeMethod<bool>('registerRemoteNotification');
    }
    return null;
  }
  /// iOS 获取 idfa。
  static FutureOr<String?> getIDFA() {
    if (Platform.isIOS) {
      return _channel.invokeMethod<String>('getIDFA');
    } else {
      return null;
    }
  }

  /// 通知原生：用户退出登录。
  ///
  /// - 用户退出登录时，【一洽客服】要同步退出。
  static void userLogout({required int uid}) =>
      _channel.invokeMethod('userLogout', uid);

  /// 打开 App Store。
  static void gotoAppStore() => _channel.invokeMethod('gotoAppStore');

  static void log(String message) => _channel.invokeMethod('log', message);
}
